# GoSpeed 多架构Dockerfile
# 支持平台: linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6
# 使用多阶段构建减小镜像体积，支持交叉编译

# 构建阶段 - 使用golang基础镜像进行编译
FROM --platform=$BUILDPLATFORM golang:1.22-alpine AS builder

# 构建参数定义
# TARGETPLATFORM: 目标平台 (如 linux/amd64)
# BUILDPLATFORM: 构建平台 (如 linux/amd64)  
# TARGETOS: 目标操作系统 (如 linux)
# TARGETARCH: 目标架构 (如 amd64)
ARG TARGETPLATFORM
ARG BUILDPLATFORM
ARG TARGETOS
ARG TARGETARCH

# 设置阿里云镜像源加速apk安装
# 将Alpine官方源替换为阿里云镜像，提高国内网络环境下的构建速度
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 设置Go模块代理
# 使用阿里云Go代理作为主要代理，goproxy.cn作为备用，确保依赖下载稳定
ENV GOPROXY=https://mirrors.aliyun.com/goproxy/,https://goproxy.cn,direct
ENV GO111MODULE=on

# 设置工作目录
WORKDIR /app

# 安装构建依赖
# git: 用于获取Go模块
# ca-certificates: 用于HTTPS连接
# tzdata: 时区数据
RUN apk add --no-cache git ca-certificates tzdata

# 复制Go模块文件
# 先复制go.mod和go.sum，可以利用Docker层缓存机制
COPY go.mod go.sum ./

# 下载Go依赖
# 在源代码之前下载依赖，提高构建效率
RUN go mod download

# 复制源代码
COPY . .

# 构建二进制文件
# CGO_ENABLED=0: 禁用CGO，生成静态二进制文件
# GOOS/GOARCH: 根据目标平台设置编译参数，支持交叉编译
# -ldflags="-w -s": 去除调试信息和符号表，减小文件体积
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \
    go build -a -installsuffix cgo -ldflags="-w -s" -o GoSpeed .

# 设置镜像标签（符合OCI标准）
LABEL org.opencontainers.image.source="https://github.com/liumou-site/GoSpeed" \
      org.opencontainers.image.description="GoSpeed - A high-speed download tool" \
      org.opencontainers.image.licenses="MIT" \
      org.opencontainers.image.title="GoSpeed" \
      maintainer="liumou-site"

# 运行阶段 - 最终生产镜像
# 使用alpine作为基础镜像，体积小巧且安全
FROM --platform=$TARGETPLATFORM alpine:latest

# 设置构建参数
ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH

# 设置阿里云镜像源加速apk安装
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 安装运行时依赖
# ca-certificates: 用于HTTPS证书验证
# tzdata: 时区数据支持
RUN apk --no-cache add ca-certificates tzdata

# 创建非root用户（安全最佳实践）
# 使用非root用户运行应用，提高容器安全性
# -g/-u 1000: 设置组ID和用户ID为1000
# -S: 创建系统用户/组
RUN addgroup -g 1000 -S gospeed && \
    adduser -u 1000 -S gospeed -G gospeed

# 设置工作目录
WORKDIR /app

# 复制编译好的二进制文件
# 从构建阶段复制GoSpeed可执行文件到当前镜像
COPY --from=builder /app/GoSpeed .

# 复制默认配置文件
# urls.txt包含默认的下载链接列表
COPY --from=builder /app/urls.txt ./urls.txt

# 创建数据目录并设置权限
# 创建/data目录用于存储下载的文件
# 递归设置/app目录及其内容的用户和组权限
RUN mkdir -p /app/data && \
    chown -R gospeed:gospeed /app

# 切换到非root用户（当前注释掉，可根据需要启用）
# USER gospeed

# 设置时区
ENV TZ=Asia/Shanghai

# 设置GoSpeed默认环境变量
# 这些变量对应GoSpeed应用的各种配置选项
# GOSPEED_THREAD: 下载线程数
# GOSPEED_MAX_SIZE: 最大文件大小限制(0表示无限制)
# GOSPEED_TIME_START/GOSPEED_TIME_STOP: 下载时间窗口
# GOSPEED_DEBUG: 是否启用调试模式
# GOSPEED_MEMORY: 内存限制(MB)
ENV GOSPEED_THREAD=4 \
    GOSPEED_MAX_SIZE=0 \
    GOSPEED_TIME_START=9 \
    GOSPEED_TIME_STOP=23 \
    GOSPEED_DEBUG=false \
    GOSPEED_MEMORY=2048

# 健康检查配置
# interval: 检查间隔时间
# timeout: 检查超时时间  
# start-period: 启动等待时间
# retries: 重试次数
# 检查GoSpeed进程是否在运行
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD pgrep GoSpeed || exit 1

# 复制入口点脚本
# 入口点脚本用于初始化容器和启动应用
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

# 设置容器入口点
# 使用exec形式确保信号正确处理
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]